﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Web;
using NUnit.Framework;
using Spring.Context;
using SistemaDeBastanteodePoderes.Negocio;
using SistemaDeBastanteodePoderes.Dominio;
using SistemaDeBastanteodePoderes.Persistencia;
using Spring.Context.Support;

namespace SistemaDeBastanteodePoderes.Pruebas.Negocio
{
    [TestFixture]
    public class Test_H4_AbogadoService
    {
        IApplicationContext Spring = null;
        IAbogadoService Service = null;
        Bastanteo bastanteoRegistrado = null;
        TipoIntervencion tipoIntCreado = null;

        Cliente clienteCreado = null;
        TipoEmpresa tipoEmpCreado = null;

        Poder poder1Creado = null;
        Poder poder2Creado = null;
        TipoServicio tipoSerCreado = null;

        [TestFixtureSetUp]
        public void InicioPruebas()
        {
            Spring = new XmlApplicationContext(
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaPersistencia.xml",
                "assembly://SistemaDeBastanteodePoderes/SistemaDeBastanteodePoderes/capaNegocio.xml"
                );
            Service = (IAbogadoService)Spring.GetObject("abogadoService");
            tipoEmpCreado = ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Crear(new TipoEmpresa() { Abreviacion = "SAA", Descripcion = "SOCIEDAD ANONIMA ABIERTA" });
            clienteCreado = ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Crear(new Cliente()
            {
                nroRUC = "RUC01",
                razSocial = "RAZON01",
                fecIniOperaciones = DateTime.Now,
                tipEmpresa = tipoEmpCreado,
                cntEmpleados = 17
            });
            tipoIntCreado = ((ITipoIntervencionDAO)Spring.GetObject("tipoIntDAO_NH")).Crear(new TipoIntervencion() {  Intervencion = "A SOLA FIRMA" });
            tipoSerCreado = ((ITipoServicioDAO)Spring.GetObject("tipoSerDAO_NH")).Crear(new TipoServicio() {  Servicio = "ACTIVO"});
            poder1Creado = ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Crear(new Poder() { CodCorto = "POD01", NomPoder = "PODER 01", Servicio = tipoSerCreado });
            poder2Creado = ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Crear(new Poder() { CodCorto = "POD02", NomPoder = "PODER 02", Servicio = tipoSerCreado });
        }

        [Test]
        public void Test1_BastantearPoder_OK()
        {
            Assert.DoesNotThrow(delegate
            {
                bastanteoRegistrado = Service.BastantearPoder("A", poder1Creado.Codigo, tipoIntCreado.Codigo, " ", 1000, DateTime.Now.AddMonths(6), clienteCreado.Codigo); 
            });

            Assert.IsNotNull(bastanteoRegistrado);
            Assert.Greater(bastanteoRegistrado.Codigo, 0);
            Assert.AreEqual(bastanteoRegistrado.PoderAsignado.Codigo, poder1Creado.Codigo);
            Assert.AreEqual(bastanteoRegistrado.Grupo, "A");
            Assert.AreEqual(bastanteoRegistrado.Intervencion.Codigo, tipoIntCreado.Codigo);
            Assert.AreEqual(bastanteoRegistrado.Empresa.Codigo, clienteCreado.Codigo);
        }

        [Test]
        public void Test2_BastantearPoder_NOK_MismoPoderMismaIntervencionMismaCombinacion()
        {
            Bastanteo bastanteoAux = null;
            Assert.Catch<EntidadRepetidaException>(delegate
            {
                bastanteoAux = Service.BastantearPoder("A", poder1Creado.Codigo, tipoIntCreado.Codigo, " ", 1000, DateTime.Now.AddMonths(6), clienteCreado.Codigo); 

            });
            Assert.IsNull(bastanteoAux);
        }


        [TestFixtureTearDown]
        public void FinalizarPruebas()
        {
            ((IBastanteoDAO)Spring.GetObject("bastanteoDAO_NH")).Eliminar(bastanteoRegistrado);
            ((IClienteDAO)Spring.GetObject("clienteDAO_NH")).Eliminar(clienteCreado);
            ((ITipoEmpresaDAO)Spring.GetObject("tipoEmpDAO_NH")).Eliminar(tipoEmpCreado);
            ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poder1Creado);
            ((IPoderDAO)Spring.GetObject("poderDAO_NH")).Eliminar(poder2Creado);
            ((ITipoServicioDAO)Spring.GetObject("tipoSerDAO_NH")).Eliminar(tipoSerCreado);
            ((ITipoIntervencionDAO)Spring.GetObject("tipoIntDAO_NH")).Eliminar(tipoIntCreado);
            Spring.Dispose();
            Spring = null;
        }

    }
}